import vnode from './vnode.js';
//编写一个低版本的h函数，这个函数必须接受三个参数，缺一不可
// 相当于他的重载功能较弱
// 也就是说调用时候形态必须收下面的三种形态之一
// 形态1：h('div',{},"文字")
// 形态2：h('div',{},[])
// 形态3：h('div',{},h())
export default function (sel,data,c){
	// 检查参数个数
	if(arguments.length != 3)  throw new Error("请输入完整参数！");
	// 分类讨论，检查参数c的类型
	if(typeof c =='string' || typeof c == 'number'){
		// 说明此时是c参数是形态1的情况
		return vnode(sel,data,undefined,c,undefined)
	}
	else if (Array.isArray(c)){
		// 说明此时c是形态2的情况
		let children = [];
		// 遍历c，收集children
		for(var i=0;i<c.length;i++){
			// 检查c[i]必须是一个对象，如果不满足
			if(!(typeof c[i] ==='object' && c[i].hasOwnProperty('sel'))){
				throw new Error("传入的数组参数中必须全是h函数")
			}
			children.push(c[i]);
		}
		// 循环结束，说明children已经收集完毕了，可以返回虚拟节点了，他含有children这个属性
		return vnode(sel,data,children,undefined,undefined);
	}
	else if(typeof c == 'object' && c.hasOwnProperty('sel')){
		// 说明此时c处于形态3的情况
		// 注意：此时传入的c是唯一的children，同时c是h函数的执行，返回的结果就是一个对象
		let children =[c];
		return vnode(sel,data,children,undefined,undefined);
	}
	else{
		throw new Error("传入的参数不合法")
	}
}